home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / comm2 / mmrstrbd.lha / MM / Rexx / MM_RestoreBad.rexx < prev    next >
OS/2 REXX Batch file  |  1996-05-06  |  10KB  |  535 lines

  1. /*
  2.  
  3.                       $VER: MM_RestoreBad 0.16  (06.05.96)
  4.  
  5.                             (C) 1996 Robert Hofmann
  6.  
  7. */
  8.  
  9. parse arg args
  10.  
  11. options cache
  12. options failat 99
  13. options results
  14.  
  15. signal on break_c
  16. signal on break_d
  17. signal on break_e
  18. signal on break_f
  19. signal on halt
  20. signal on ioerr
  21. signal on syntax
  22.  
  23. address 'MAILMANAGER'
  24.  
  25.  
  26. Main:
  27.  
  28.     call Init
  29.     call Header
  30.     call Parse_Args(strip(args))
  31.     Show
  32.     if system.arg.gui    then call GUI
  33.     call Search_Msgs
  34.     if system.msgs.count=0 then call Quit(6, 'No msgs selected!!!')
  35.     call Restore_Msgs
  36.  
  37. call Quit(0, 'All done.')
  38. exit
  39.  
  40.  
  41. Add_Export: procedure Expose system.
  42.  
  43.     arg area
  44.  
  45.     if find(system.export, area)>0 then return
  46.  
  47.     system.export    = system.export area
  48.  
  49.     MM_AddToStem 'system.export' 'area'
  50.  
  51. return
  52.  
  53.  
  54. Add_Msg: procedure Expose found.
  55.  
  56.     parse arg nr, area, . 'PATH: ' path
  57.  
  58.     if length(path)>30 then parse value right(path, 30) with . path
  59.  
  60.     path = strip(path)
  61.  
  62.     MM_AddToStem 'found.msg'    'nr'
  63.     MM_AddToStem 'found.area'    'area'
  64.     MM_AddToStem 'found.path'    'path'
  65.  
  66.     found.maxlen    = max(found.maxlen, length(area)+1)
  67.     found.count        = found.msg.count
  68.  
  69. return
  70.  
  71.  
  72. Add_Msg_Req: procedure Expose ask. found.
  73.  
  74.     parse arg nr
  75.  
  76.     tmp    = left(found.area.nr',', found.maxlen) right(found.msg.nr, 4)':  'found.path.nr
  77.     MM_AddToStem 'ask' 'tmp'
  78.  
  79. return
  80.  
  81.  
  82. break_c:; break_d:; break_e:; break_f:; halt:
  83.  
  84.     signal off break_c
  85.     signal off break_d
  86.     signal off break_e
  87.     signal off break_f
  88.     signal off halt
  89.  
  90.     return_code        =    5
  91.     error_line    = 0
  92.     error_msg            = 'Execution halted!!!'
  93.     rc                        = 0
  94. signal Exit
  95.  
  96.  
  97. Exit:
  98.  
  99.     select
  100.         when return_code>=40 then error = 'INTERNAL-ERROR:'
  101.         when return_code>=30 then error = 'IO-ERROR:'
  102.         when return_code>=20 then error = 'ERROR:'
  103.         when return_code>=10 then error = 'WARNING:'
  104.         when return_code>=5  then error = 'INFO:'
  105.         otherwise                                    error = ''
  106.     end
  107.  
  108.     if return_code>5 & ~system.arg.noreq then
  109.         call Request_Choice('\c\n'error'\n\n   ' error_msg '   \n', '* _OK ', '_')
  110.  
  111.   call Log()
  112.     call Log('***' strip(error error_msg) '***', '+')
  113.     call Log(,'\')
  114.  
  115.     call setclip('MM_LogPre', system.mm.logpre)
  116.  
  117. exit return_code
  118.  
  119.  
  120. Get_Arg: procedure Expose args system.
  121.  
  122.   arg keyword, mode, old
  123.  
  124.     uargs    = upper(args)
  125.     p            = find(uargs, keyword)
  126.  
  127.     if p=0    then
  128.         do
  129.             p = pos(' 'keyword'=', ' 'uargs)
  130.  
  131.             if p>0 then    args    = overlay(' ', args, p+length(keyword))
  132.  
  133.       p = find(upper(args), keyword)
  134.         end
  135.  
  136.     system.cmdopt.keyword    = p>0
  137.  
  138.     select
  139.         when mode=0    then
  140.             if p>0 then
  141.                 do
  142.                     ret        = 1
  143.                     args    = delword(args, p, 1)
  144.                 end
  145.             else ret    = old
  146.  
  147.         when mode=1 then
  148.             if p>0 then
  149.                 do
  150.                     left    = subword(args, 1, p-1)
  151.                     rest    = subword(args, p+1)
  152.  
  153.                     if left(rest, 1)='"' then    parse var rest . '"'    ret '"'    rest
  154.                     else                                            parse var rest                ret            rest
  155.  
  156.                     args    = strip(left strip(rest))
  157.                 end
  158.             else ret    = old
  159.  
  160.         when mode=2 then
  161.             do
  162.                 if left(args, 1)='"'    then    parse var args . '"'    ret '"'    args
  163.                 else                                                parse var args                ret         args
  164.  
  165.                 if strip(ret)=''            then    ret = old
  166.             end
  167.  
  168.         otherwise exit 99
  169.     end
  170.  
  171.     args    = strip(args)
  172.     ret        = strip(ret, 'b', '" ')
  173.  
  174. return ret
  175.  
  176.  
  177. Get_Version: procedure
  178.  
  179.     parse arg mode
  180.  
  181.     parse value sourceline(3-mode) with . . ver .
  182.     parse var ver tst 'ß' .
  183.  
  184.     if ~datatype(strip(tst, 'b', '/ce '), 'N') then
  185.         if ~mode then ver = Get_Version(1)
  186.         else exit 99
  187.  
  188. return ver
  189.  
  190.  
  191. GUI: procedure Expose system.
  192.  
  193.     call Log('Scanning' system.mm.badarea'...')
  194.  
  195.     MM_SearchMsgs system.mm.badarea 'msgs' '#?' '#?' '#?' '!DEL' '!MARK' 'UNLNKNODE'
  196.  
  197.     found.    = 0
  198.  
  199.     do n=0 to msgs.count-1
  200.         MM_ReadMsg system.mm.badarea msgs.n 'msg'
  201.         if RC>0 then iterate
  202.  
  203.         parse var msg.head.0 . 'AREA:' real_area .
  204.         tmp    = msg.foot.count-1
  205.  
  206.         call Add_Msg(msgs.n, real_area, msg.foot.tmp)
  207.     end
  208.  
  209.     ask.        = 0
  210.  
  211.     do n=0 to found.count-1
  212.         call Add_Msg_Req(n)
  213.     end
  214.  
  215.     MM_SortStem 'ask'
  216.  
  217.     ret.    = 0
  218.     MM_MultiSelReq 'ask' 'ret' '"Select msgs to restore"' 'STR'
  219.     if ret.count=0    then call Quit(5, 'Aborted by user!')
  220.  
  221.     call Log('Marking msgs...')
  222.  
  223.     mark  = 'MARK'
  224.  
  225.     do n=0 to ret.count-1
  226.         parse var ret.n . ',' nr .
  227.  
  228.         MM_EditMsgFlags system.mm.badarea nr 'mark'
  229.     end
  230.  
  231. return
  232.  
  233.  
  234. Header:
  235.  
  236.     call Log(,'/')
  237.     call Log('***' system.prg.id '***', '+')
  238.     call Log(' 'system.prg.cr)
  239.     call Log()
  240.  
  241. return
  242.  
  243.  
  244. Init:
  245.  
  246.     system.                        = 0
  247.  
  248.     MM_GetTaskPri                'system.taskpri'
  249.     call                                pragma('p', system.taskpri)
  250.  
  251.     system.prg.ver        = Get_Version(0)
  252.     system.prg.name        = 'MM_RestoreBad'
  253.     system.prg.id            = system.prg.name 'v'system.prg.ver
  254.     system.prg.cr            = '(C) 1996 Robert Hofmann'
  255.     system.tmpfile        = 'T:'system.prg.name'.tmp'
  256.     system.mm.logpre     = getclip('MM_LogPre')
  257.     system.prg.logpre    = system.mm.logpre'|'
  258.     call                                setclip('MM_LogPre', system.prg.logpre)
  259.     system.cmdopts        = 'BADAREA/A,MSG/K/N,MARKED/S,GUI/S,NOREQ/S,EXPORT/S'
  260.     system.warn                = '*** WARNING:'
  261.  
  262.     MM_Version                    'system.mm'
  263.     MM_GetAreas                    'system.mm' 'BAD'
  264.  
  265.     system.mm.badarea    = system.mm.0
  266.  
  267.     if system.mm.release<445    then call Quit(10, 'Sorry, you need MM >= v1.2.445 to use this script!')
  268.  
  269.     call Include_Lib('rexxsupport')
  270. return
  271.  
  272.  
  273. Include_Lib: procedure Expose system.
  274.  
  275.     parse arg lib, prio
  276.     if right(upper(lib), 8)~='.LIBRARY' then lib    = lib'.library'
  277.     if prio=''                                                    then prio    = 0
  278.  
  279.     if ~show('l', lib) then
  280.         if ~addlib(lib, prio, -30, 0) then call Quit(20, 'Could not open' lib'!!!')
  281.  
  282. return
  283.  
  284.  
  285. IOerr:
  286.  
  287.     signal off ioerr
  288.  
  289.     return_code        = 20
  290.     error_line    = sigl
  291.     error_msg            = 'IO-error' rc 'at line' sigl '['errortext(rc)']')
  292.     rc                        = 0
  293. signal Exit
  294.  
  295.  
  296. Log: procedure Expose system.
  297.  
  298.     parse arg text, pre
  299.  
  300.     tmp        = word('PRG MM', (pre~='')+1)
  301.     text    = system.tmp.logpre || pre' 'text
  302.  
  303.     MM_WriteLog 'text' '2'
  304. return
  305.  
  306.  
  307. Parse_Args: procedure Expose system.
  308.  
  309.     parse arg args
  310.  
  311.     tpl        = system.cmdopts',?/S'
  312.     args    = translate(args, '  ', '9'x)
  313.  
  314.     pk        = pos('/K', tpl)
  315.     ps        = pos('/S', tpl)
  316.  
  317.     select
  318.         when pk=0    & ps=0    then    p    = 0
  319.         when pk=0 & ps>0    then  p    = ps
  320.         when ps=0 & pk>0    then    p    = pk
  321.         otherwise                                p    = min(pk, ps)
  322.     end
  323.  
  324.     p            = lastpos(',', left(tpl, p))
  325.     tpl        = substr(tpl',', p+1) || left(tpl, max(p-1, 0))
  326.  
  327.     do while tpl~=''
  328.         parse var tpl template ',' tpl
  329.         parse var template keyword '/' .
  330.  
  331.         bool    = pos('/S',    template)>0
  332.         key        = pos('/K', template)>0
  333.         must    = pos('/A', template)>0
  334.         num        = pos('/N', template)>0
  335.  
  336.         select
  337.             when must then        system.arg.keyword    = '0'x
  338.             when bool    then        system.arg.keyword    = 0
  339.             when num    then        system.arg.keyword    = 0
  340.  
  341.             otherwise                    system.arg.keyword    = ''
  342.         end
  343.  
  344.         if bool | key    then    mode    = ~bool
  345.         else                                mode    = 2
  346.  
  347.         system.arg.keyword    = Get_Arg(keyword, mode, system.arg.keyword)
  348.  
  349.         if must & system.arg.keyword='0'x then
  350.             do
  351.                 tmp    = template 'missing!!!'
  352.  
  353.                 say
  354.                 say ' ***' tmp '***'
  355.  
  356.                 signal Usage
  357.             end
  358.  
  359.         if num & ~datatype(system.arg.keyword, 'N') & ~must & system.arg.keyword~='' then
  360.             do
  361.                 tmp    = 'Numeric value expected for' template', but is "'system.arg.keyword'"!!!'
  362.  
  363.                 say
  364.                 say ' ***' tmp '***'
  365.  
  366.                 signal Usage
  367.             end
  368.     end
  369.  
  370.     tmp    = '?'; if system.arg.tmp then signal Usage
  371.  
  372.     if args~='' then call Quit(10, 'Unknown option(s):' args)
  373.  
  374.  
  375.     if upper(system.mm.badarea)~=upper(system.arg.badarea) then call Quit(5, system.arg.badarea 'is not your #BADAREA!')
  376.  
  377.     if system.arg.gui & system.arg.msg>0        then call Quit(11, 'You must not use GUI/S together with MSG/K/N')
  378.     if system.arg.marked & system.arg.msg>0    then call Quit(12, 'You must not use MARKED/S together with MSG/K/N')
  379.  
  380.     if system.arg.msg=0 & ~system.arg.marked & ~system.arg.gui    then call Quit(13, 'Too few arguments!!!')
  381.  
  382. return
  383.  
  384.  
  385. Quit:
  386.  
  387.     parse arg return_code, error_msg
  388.  
  389.     error_line    = 0
  390.     rc                        = 0
  391. signal Exit
  392.  
  393.  
  394. Replace: procedure
  395.  
  396.     parse arg string,new,old
  397.  
  398.     do while index(string, old) ~= 0
  399.         interpret "parse var string l '"old"' r"
  400.         string = l || new || r
  401.     end
  402.  
  403. return string
  404.  
  405.  
  406. Request_Choice: procedure Expose system.
  407.  
  408.     parse arg text, buttons, ret_vals
  409.  
  410.     title    = system.prg.name'-Requester'
  411.     text    = translate(Replace(text, '0A'x, '\n'), '1b'x, '\')
  412.  
  413.     if length(text)<40 then text = center(text, 40)
  414.  
  415.     MM_Requester title 'text' 'buttons'
  416.  
  417.     if rc=0 then rc=words(ret_vals)
  418.  
  419. return compress(word(ret_vals, rc), '_')
  420.  
  421.  
  422. Restore_Msgs: procedure Expose system.
  423.  
  424.     if system.arg.msg=0    then
  425.         if ~Request_Choice('\c\n    Restore selected msg(s)?    \n', '* _YES | _NO ', '1 0') then
  426.             call Quit(5, 'Aborted by user!')
  427.  
  428.     bad                        = system.mm.badarea
  429.     system.export    = ''
  430.  
  431.     do n=0 to system.msgs.count-1
  432.         nr    = system.msgs.n
  433.  
  434.         MM_ReadMsg bad nr 'msg'
  435.         if RC>0 then
  436.             do
  437.                 call Warn_Req('Msg #'nr 'does not exist!')
  438.                 iterate
  439.             end
  440.  
  441.         parse var msg.head.0 . 'AREA:' real_area .
  442.  
  443.       MM_GetAreaInfo real_area 'real'
  444.         if RC>0    then
  445.             do
  446.                 call Warn_Req(real_area 'does not exist!')
  447.                 iterate
  448.             end
  449.  
  450.         txt    = bad', msg #'nr 'to' real_area
  451.  
  452.         MM_MoveMsg bad nr real_area
  453.         if RC>0    then
  454.             do
  455.                 call Warn_Req('Unable to restore' txt'!')
  456.                 iterate
  457.             end
  458.  
  459.         call Add_Export(real_area)
  460.         call Log('Restored' txt'.')
  461.     end
  462.  
  463.     if ~system.arg.noreq & ~system.arg.export    then
  464.         exp = Request_Choice('\c\nExport processed areas?\n', '* _YES | _NO ', '1 0')
  465.     else exp = 0
  466.  
  467.     if system.arg.export | exp then
  468.         do
  469.             MM_SortStem 'system.export'
  470.  
  471.             do n=0 to system.export.count-1
  472.                 call Log(' Exporting area' system.export.n'...')
  473.  
  474.                 MM_Export system.export.n
  475.             end
  476.         end
  477.  
  478.     call Log(' Cleaning' bad'...')
  479.  
  480.     MM_CleanArea bad
  481.  
  482. return
  483.  
  484.  
  485. Search_Msgs: procedure Expose system.
  486.  
  487.     if system.arg.msg>0 then
  488.         do
  489.             MM_AddToStem 'system.msgs' 'system.arg.msg'
  490.             return
  491.         end
  492.  
  493.     call Log('Searching for marked msgs...')
  494.  
  495.     MM_SearchMsgs system.mm.badarea 'system.msgs' '#?' '#?' '#?' 'MARK'
  496.  
  497. return
  498.  
  499.  
  500. Syntax:
  501.  
  502.     signal off syntax
  503.  
  504.     return_code        = 40
  505.     error_line    = sigl
  506.     error_msg            = 'Syntax-error' rc 'at line' sigl '['errortext(rc)']'
  507.     rc                        = 0
  508. signal Exit
  509.  
  510.  
  511. Usage:
  512.  
  513.     rx.            = ''
  514.     rx.0.0    = '[rx] '
  515.     rx.0.1    = '[.rexx]'
  516.     m                =    pos('/e', system.prg.ver)>0
  517.     tmp            = rx.m.0 || system.prg.name || rx.m.1
  518.  
  519.     say
  520.     say 'Usage:' tmp system.cmdopts
  521.     say
  522. call Quit(0, 'Usage requested.')
  523.  
  524.  
  525. Warn_Req: procedure Expose system.
  526.  
  527.     parse arg text
  528.  
  529.     if ~system.arg.noreq then call Request_Choice('\c\n'system.warn'\n\n'text'\n', '*  _OK  ', '_')
  530.     call Log(system.warn text)
  531.  
  532. return
  533.  
  534.  
  535.